字符
|
表示在两个或多个项之间进行选择,类似或/
开始和结尾\
转义
-
连字符,当且仅当在字符组 []
的内部表示一个范围,比如[A-Z]
表示范围从A
到Z
;如果需要在字符组里面表示普通字符 -
,放在字符组的开头或结尾即可.
匹配出换行符 \n
之外的任何单个字符\d
等价[0-9]
,匹配0
到9
数字\D
等价[^0-9]
,与 \d
相反\w
匹配以下字符:A-Z、a-z、0-9
个下划线,等价于 [A-Za-Z0-9]
\W
[^A-Za-z0-9]
限定符(量词字符)
显示限定符位于大括号{}
中,并包括指示出现次数上下限的数值; *+?
这三个字符属于单字符限定符:
{n}
刚好匹配 n
请输入代码次{n,}
至少匹配 n
次{n,m}
匹配至少 n
次,至多 m
次,即匹配 n
到 m
次*
等价 {0,}
+
等价 {1,}
?
等价 {0,1}
注意:
显示限定符中,逗号和数字之间不能有空格,否则返回
null
贪婪量词
*
和+
:JavaScript
默认是贪婪匹配,即匹配重复字符是尽可能多的匹配惰性(最少重复匹配)量词
?
:当进行贪婪匹配,只需要在要匹配的字符后面加上一个?
即可
var reg = /a+/;
var reg2 = /a+?/;
var str = 'aaab';
str.match(reg); // ["aaa"]
str.match(reg2); // ["a"]
定位点(锚字符、边界)
^
匹配开始的位置。将 ^
用作括号 []
表达式中的第一个字符,则会对字符集求反$
匹配结尾的位置\b
与一个字边界匹配,比如 er\b
与 "never
" 中的 "er
" 匹配,但与 "verb
" 中的 "er
" 不匹配\B
非边界字匹配
标记
[]
字符组,标记括号表达式的开始和结尾。[...]
匹配括号内任意字符。很多字符在 []
都会失去原来的意义:[^...]
匹配不在括号内的任意字符;[?.]
匹配普通的问号和点号
注意:
\
在 []
中仍为转义字符。如果要匹配反斜杠字符,使用两个反斜杠 \\
{}
标记限定符表达式的开始和结尾{}
标记子表达式的开始和结尾,主要作用是分组,对内容进行区分
(模式) 记住和这个模式匹配的匹配项(捕获分组),不要滥用括号,如果不需要保存子表达式,可使用非捕获型括号 (?:)
来进行性能优化(?:模式
) 与模式匹配,但不保存匹配项(非捕获分组)(?=模式)
零宽正向先行断言,要求匹配与模式匹配的搜索字符串。找到一个匹配项后,将在匹配文本之前开始搜索下一个匹配项;但不会保存匹配项(?!模式)
零宽负向先行断言,要求匹配与模式不匹配的搜索字符串。找到一个匹配项后,将在匹配文本之前开始搜索下一个匹配项;但不会保存匹配项先行断言 ?=
模式:x
只有在 y
前面才匹配,必须写成 /x(?=y)/
。解释:找一个 x
,那个 x
的后面要有 y
先行否定断言 ?!
模式:x
只有不在 y
前面才匹配,必须写成 /x(?!y)/
。解释:找一个 x
,那个 x
的后面没有 y
ES7提案
后行断言( ?<= 模式)
:与”先行断言”相反, x
只有在y
后面才匹配,必须写成 /(?<=y)x/
。解释:找一个 x
,那个 x
的前面要有 y
。后行否定断言 ( ?<! 模式)
: 与”先行否定断言“相反,x
只有不在y
后面才匹配,必须写成 /(?<!y)x/
。 解释:找一个x
,那个 x
的前面没有 y
。反向引用
:主要作用是给分组加上标识符 ln n 表示引用字符,与第 ln 个子表达式第一次匹配的字符相匹配
var str = '<div class="o2">' +
'<div class="o2_team">' +
'<img src="">' +
'</div>' +
'</div> ';
// <(?!img) 表示找一个左尖括号<,而且左尖括号 < 的后面没有img字符;
// (?:.|\r|\n)*? 表示匹配左右尖括号<>里面的.或\r或\n,而且匹配次数为*?;(?:)不保存匹配项,提高性能;
// *后面加个? 表示非贪婪匹配。
var reg = /<(?!img)(?:.|\r|\n)*?>/gi;
str.match(reg);
反向引用的例子,给 MikeMike 字符后加个单引号:
var reg = /(Mike)(\1)(s)/;
var str = "MikeMikes";
console.log(str.replace(reg, "$1$2'$3"));
// 返回结果 MikeMike's
非打印字符
\s
任何空白字符。即 [\f\n\r\t\v]
\S
任何非空白字符\t
Tab
字符 (\u0009)
\n
换行符 (\u000A)
\v
垂直制表符 (\u000B)
\f
换页符 (\u000C)
\r
回车符 (\u000D)
注意
\n
和 \r
一起使用,即 /[\r\n]/g
来匹配换行,因为 Unix
扩展的系统以 \n
标志结尾,Windows
以 \r\n
标志结尾
其他
\cx
匹配 x
指示的控制字符,要求 x
的值必须在 A-Z
或 a-z
范围内\xn
匹配 n n
是一个十六进制转义码,两位数长\un
匹配 n
其中 n
是以四位十六进制数表示的 Unicode
字符\nm
或 \n
先尝试反向引用,不可则再尝试标识为一个八进制转义码\nml
当 n
是八进制数字 (0-3)
,m
和 l
是八进制数字 (0-7)
时,匹配八进制转义码 nml
修饰符
i
执行不区分大小写的匹配g
执行一个全局匹配,即找到所有的匹配,而不是在找到第一个之后就停止m
多行匹配模式,^
匹配一行的开头和字符串的开头,$
匹配行的结束和字符串的结束ES6
新增 u
和 y
修饰符
u
修饰符 Unicode
模式,用来正确处理大于 \uFFFF
的 Unicode
字符。正确处理四个字节的 UTF-16
编码
// 加u修饰符以后,ES6就会识别\uD83D\uDC2A为一个字符,返回false。
/^\uD83D/u.test('\uD83D\uDC2A'); // false
/^\uD83D/.test('\uD83D\uDC2A'); // true
y
修饰符 与g
修饰符都是全局匹配,不同之处在于:lastIndex
属性指定每次搜索的开始位置,g
修饰符从这个位置开始向后搜索,直到发现匹配为止;但是 y 修饰符要求必须在 lastIndex
指定的位置发现匹配,即 y
修饰符确保匹配必须从剩余的第一个位置开始
/b/y.exec('aba') // null
/b/.exec('aba') // ["b"]
优先级顺序
\
转义符(),(?:),(?=),[]
括号和中括号*、+、?、{n}、{n,}、{n,m}
限定符
任何元字符 ^、$、\
定位点和序列|
替换
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。